package com.prj.ufdm.cloud.ms.test.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.prj.ufdm.cloud.base.util.BaseUuidUtil;
import com.prj.ufdm.cloud.ms.test.model.dbtable.DbTableColumn;
import com.prj.ufdm.cloud.ms.test.model.jsontable.FastJsonTable;

/** 
* DESC: FastJson 工具类
* @date 2020年02月28日 
* @author 胡义振
*/
public class FastJsonUtils {
	
	/**
	 * DESC: 从JSON中获取表
	 * @auther 胡义振
	 * @date 2020年2月28日
	 * @param fastJsonTableList
	 * @param object
	 * @param tableName
	 * @return 
	 * @return
	 */
	public static List<FastJsonTable> doGetJsonTable(List<FastJsonTable>  fastJsonTableList,Object object,String tableName,List<Map<String,String>> paramRecordList){
		if(fastJsonTableList==null) {
			fastJsonTableList = new ArrayList<FastJsonTable>();
		}
		FastJsonTable fastJsonTable = new FastJsonTable();
		fastJsonTable.setTableName(tableName.toUpperCase());
		fastJsonTable.setTableId(tableName.toUpperCase()+"_ID");
		if(object instanceof JSONObject) {
			// 列信息
			List<DbTableColumn> tableColumnList = new ArrayList<DbTableColumn>();
			DbTableColumn idColumn = new DbTableColumn();
			idColumn.setColumnName(fastJsonTable.getTableId());
			idColumn.setColumnType("varchar");
			idColumn.setColumnLength(64);
			tableColumnList.add(idColumn);
			// 数据信息
			Map<String,String> recordMap = new HashMap<String,String>();
			recordMap.put(fastJsonTable.getTableId(), BaseUuidUtil.getUUID());
			JSONObject jsonObject = (JSONObject) object;
			for(Map.Entry<String,Object> entry : jsonObject.entrySet()){
		        String key = entry.getKey();
		        Object subObject = jsonObject.get(key);
		        boolean hasSubElement = FastJsonUtils.hasSubElement(subObject);
		        // 如果有子元素
		        if(hasSubElement) {
		        	doGetJsonTable(fastJsonTableList,subObject,tableName + "_" + key,null);
		        }
		        else {
		        	DbTableColumn tableColumn = new DbTableColumn();
		        	tableColumn.setColumnName(key);
		        	tableColumnList.add(tableColumn);
		        	recordMap.put(key, subObject!=null ? subObject.toString() : "");
		        }
		    }
			// 判断是否为JSONArray数据
			if(paramRecordList==null || paramRecordList.size()==0){
				// 设置表信息
				List<Map<String,String>> jsonObjectRecordList = new ArrayList<Map<String,String>>();
				jsonObjectRecordList.add(recordMap);
				fastJsonTable.setRecordList(jsonObjectRecordList);
			}
			else {
				fastJsonTable.setRecordList(paramRecordList);
			}
			// 设置列信息
			fastJsonTable.setTableColumns(tableColumnList);
			fastJsonTableList.add(fastJsonTable);
		}
		else if(object instanceof JSONArray) {
			JSONArray jsonArray = (JSONArray) object;
			Object subObject = getMaxScopeObject(jsonArray);
			List<Map<String,String>> jsonArrayRecordList = getJSONArrayRecordList(jsonArray,fastJsonTable);
			doGetJsonTable(fastJsonTableList,subObject,tableName,jsonArrayRecordList);
		}
		return fastJsonTableList;
	}
	
	/**
	 * DESC: 获取最大范围 JSONArray 中的数据
	 * @auther 胡义振
	 * @date 2020年3月3日
	 * @param jsonArray
	 * @return
	 */
	private static List<Map<String,String>> getJSONArrayRecordList(JSONArray jsonArray,FastJsonTable fastJsonTable) {
		List<Map<String,String>> recordList = new ArrayList<Map<String,String>>();
		// 遍历 allKeyMap（为了获取KEY）
		@SuppressWarnings("unchecked")
		Map<String,Object> allKeyMap = (Map<String, Object>) getMaxScopeObject(jsonArray);
		for(Object object : jsonArray) {
			if(object instanceof JSONObject) {
				// 数据信息
				Map<String,String> recordMap = new HashMap<String,String>();
				recordMap.put(fastJsonTable.getTableId(), BaseUuidUtil.getUUID());
				for(Map.Entry<String,Object> entry : allKeyMap.entrySet()){
			        String key = entry.getKey();
			        // 获取当前的值（不是 allKeyMap 中的值）
			        Object subObject = ((JSONObject) object).get(key);
			        if(!keyHasSubElementOnJSONArray(jsonArray,key)) {
			        	recordMap.put(key, subObject!=null ? subObject.toString() : "");
			        }
			    }
				recordList.add(recordMap);
			}
		}
		return recordList;
	}
	
	
	/**
	 * DESC: 获取最大范围 JSONArray 中的 Object (遍历每个Object，获取每个Object中不为空的值，然后合并成新的Object)
	 * @auther 胡义振
	 * @date 2020年3月3日
	 * @param jsonArray
	 * @return
	 */
	private static Object getMaxScopeObject(JSONArray jsonArray) {
		Map<String,Object> map = new HashMap<String,Object>();
		for(Object object : jsonArray) {
			if(object instanceof JSONObject) {
				JSONObject jsonObject = (JSONObject) object;
				for(Map.Entry<String,Object> entry : jsonObject.entrySet()){
			        String key = entry.getKey();
			        Object subObject = jsonObject.get(key);
			        if(subObject!=null) {
			            map.put(key, subObject);
			        }
			    }
			}
		}
		return JSON.toJSON(map);
	}
	
	
	/**
	 * DESC: 判断Object是否含有子对象
	 * @auther 胡义振
	 * @date 2020年2月28日
	 * @param object
	 * @return 
	 * @return
	 */
	public static boolean hasSubElement(Object object) {
		boolean isSubObject = false;
        if (object instanceof JSONObject) {
        	isSubObject = true;
        } 
        else if (object instanceof JSONArray) {
        	JSONArray subJsonArray = (JSONArray) object;
        	// 如果没有数据，不能确定是否子对象，默认非对象
        	if(subJsonArray!=null && subJsonArray.size()>0) {
        		return hasSubElement(subJsonArray.get(0));
        	}
        }
        return isSubObject;
    }
	
	/**
	 * DESC: 判断JSONArray 中一个对象的KEY，在其他对象中是否含有子元素
	 * @auther 胡义振
	 * @date 2020年2月28日
	 * @param object
	 * @return 
	 * @return
	 */
	public static boolean keyHasSubElementOnJSONArray(JSONArray jsonArray,String key) {
		boolean isSubObject = false;
		for(Object tmpObject : jsonArray) {
			if(tmpObject instanceof JSONObject) {
				 Object subObject = ((JSONObject) tmpObject).get(key);
				 if(hasSubElement(subObject)) {
					 return true;
				 }
			}
		}
        return isSubObject;
    }
	
}
